using System;

namespace Utils.MonoInject
{
    /// <summary>
    /// 自动注入集合属性 - 专门用于自动注入组件集合
    ///
    /// 用法：
    /// [AutoInjectCollection] private Collider[] allColliders;
    /// [AutoInjectCollection(true)] private List<Renderer> allRenderers;
    ///
    /// 注意事项：
    /// - 专门用于集合类型的字段（数组、List、IList等）
    /// - 会自动查找当前对象及其所有子对象中匹配类型的组件
    /// - 与 AutoInjectAttribute 的区别：此属性专门为集合设计，语义更明确
    /// - 不需要指定 Label，会查找所有匹配类型的组件
    /// - 建议在需要自动注入组件集合时使用此属性，单个组件使用 AutoInjectAttribute
    /// - 查找范围包括当前 GameObject 及其所有子级
    /// - 标记为 [AutoInjectCollection] 的字段会在 AutoInject() 方法调用时自动赋值
    /// </summary>
    [AttributeUsage(AttributeTargets.Field, Inherited = true, AllowMultiple = false)]
    public class AutoInjectCollectionAttribute : Attribute
    {
        /// <summary>
        /// 是否包含未激活的 GameObject 上的组件
        /// </summary>
        public bool IncludeInactive { set; get; } = true;

        /// <summary>
        /// 默认构造函数 - 包含未激活对象
        /// </summary>
        public AutoInjectCollectionAttribute()
        {
        }

        /// <summary>
        /// 指定是否包含未激活对象的构造函数
        /// </summary>
        /// <param name="includeInactive">是否包含未激活的 GameObject</param>
        public AutoInjectCollectionAttribute(bool includeInactive)
        {
            IncludeInactive = includeInactive;
        }
    }
}